package com.wsc.dynamicproxy;

import java.lang.reflect.Proxy;
import java.util.Random;

public class Tank implements Movable{
    @Override
    public void move() {
        System.out.println("坦克正在跑.......");

        // 模拟坦克运行了一段时间
        try {
            Thread.sleep(new Random().nextInt(1000));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Movable tank = new Tank();

        /// 在硬盘中保存这个动态生成的代理类
        // System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");


        // reflection:通过二进制字节码分析类的属性和方法

        // Proxy.newProxyInstance：通过反射动态地返回一个代理对象
        // @param loader:要指定哪个 classLoader 将对象 load 到内存中去,一般情况下是被代理类的加载器
        // @param interfaces:代理对象应该去实现哪些接口
        // @param InvocationHandler:被代理对象方法被调用的时候应该怎么做处理,就是代理类需要做什么
        // 需要实现 InvocationHandler
        Movable m = (Movable) Proxy.newProxyInstance(Tank.class.getClassLoader(),
                new Class[]{Movable.class},
                new LogHandler(tank));

        m.move();
    }
}
